home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <sys/dir.h>
-
- /* getwd shamelessly adapted from: ++jrb */
- /* pwd - print working directory Author: Adri Koppes */
-
- /* char *getwd(path)
- * char *path;
- * fill CWD in path, returns path
- * on error return NULL with error string in path
- */
-
- char *getwd(path)
- char *path;
- {
- register int fd;
- register char *n;
- char name[128];
- #ifdef __STDC__
- char *rindex(_CONST char *, int);
- #else
- extern char *rindex();
- #endif
- struct stat s, st;
- struct direct d;
-
- *name = 0;
- stat(".", &s);
- do {
- if ((fd = open("..",0)) < 0) {
- strcpy(path, "Can't open ..");
- return (char *)NULL;
- }
- st.st_dev = s.st_dev;
- st.st_ino = s.st_ino;
- st.st_mode = s.st_mode;
- st.st_nlink = s.st_nlink;
- st.st_uid = s.st_uid;
- st.st_gid = s.st_gid;
- st.st_rdev = s.st_rdev;
- st.st_size = s.st_size;
- st.st_atime = s.st_atime;
- st.st_mtime = s.st_mtime;
- st.st_ctime = s.st_ctime;
- stat("..", &s);
- chdir("..");
- if (s.st_dev == st.st_dev)
- do
- if (read(fd, (char *)&d, (int)sizeof(struct direct)) < (int)sizeof(struct direct)) {
- strcpy(path,"Can't read ..");
- return (char *)NULL;
- }
- while(d.d_ino != st.st_ino);
- else
- do {
- if (read(fd, (char *)&d, (int)sizeof(struct direct)) < (int)sizeof(struct direct)) {
- strcpy(path, "Can't read ..");
- return (char *)NULL;
- }
- stat(d.d_name, &s);
- } while ((s.st_dev != st.st_dev) || (s.st_ino != st.st_ino));
- close(fd);
- if (strcmp(".",d.d_name)) {
- strcat(name,"/");
- strcat(name,d.d_name);
- }
- } while ((s.st_ino != st.st_ino) || (s.st_dev != st.st_dev));
- if (!*name)
- {
- strcpy(path, "/");
- return path;
- }
- *path = '\0';
- while (n = rindex(name, '/')) {
- strcat(path,n);
- *n = 0;
- }
- strcat(path, name);
- return path;
- }
-